package models

import (
	"encoding/json"
	"time"
)

// Duration 自定义时间类型，支持JSON字符串解析
type Duration time.Duration

// UnmarshalJSON 自定义JSON解析
func (d *Duration) UnmarshalJSON(b []byte) error {
	var s string
	if err := json.Unmarshal(b, &s); err != nil {
		return err
	}

	duration, err := time.ParseDuration(s)
	if err != nil {
		return err
	}

	*d = Duration(duration)
	return nil
}

// MarshalJSON 自定义JSON序列化
func (d Duration) MarshalJSON() ([]byte, error) {
	return json.Marshal(time.Duration(d).String())
}

// String 返回字符串表示
func (d Duration) String() string {
	return time.Duration(d).String()
}

// ToDuration 转换为标准time.Duration
func (d Duration) ToDuration() time.Duration {
	return time.Duration(d)
}

// 服务端配置
type ServerConfig struct {
	// 基本配置
	Host                 string          `json:"host"`                    // 监听地址 (默认"0.0.0.0")
	Port                 int             `json:"port"`                    // 管理端口
	MaxConnections       int             `json:"max_connections"`         // 最大连接数
	MaxServicesPerClient int             `json:"max_services_per_client"` // 每客户端最大服务数
	Services             []ServerService `json:"services"`                // 服务端口配置列表

	// 安全配置
	Security SecurityConfig `json:"security"`

	// 性能配置
	Performance PerformanceConfig `json:"performance"`

	// 日志配置
	Logging LoggingConfig `json:"logging"`
}

// 服务端服务配置
type ServerService struct {
	Name        string `json:"name"`         // 服务名称
	Port        int    `json:"port"`         // 监听端口
	ServiceType string `json:"service_type"` // 服务类型: "proxy" 或 "management"
	Description string `json:"description"`  // 服务描述
	Enabled     bool   `json:"enabled"`      // 是否启用

	// 转发模式配置
	Remote     bool   `json:"remote"`      // 是否为远程模式：true=通过客户端转发，false=直接转发到局域网
	TargetIP   string `json:"target_ip"`   // 目标IP地址（remote=false时使用）
	TargetPort int    `json:"target_port"` // 目标端口（remote=false时使用）
}

// 客户端配置
type ClientConfig struct {
	// 基本配置
	Mode       string `json:"mode"`        // 工作模式: "internal" 或 "external"
	ClientID   string `json:"client_id"`   // 客户端ID
	ServerAddr string `json:"server_addr"` // 服务器地址
	ServerPort int    `json:"server_port"` // 服务器端口
	LocalHost  string `json:"local_host"`  // 本地监听地址（外网模式）

	// 统一服务配置（兼容两种模式）
	Services []Service `json:"services"` // 服务配置列表

	// 内网模式配置 (mode = "internal")
	Internal InternalModeConfig `json:"internal"`

	// 外部模式配置 (mode = "external")
	External ExternalModeConfig `json:"external"`

	// 安全配置
	Security SecurityConfig `json:"security"`

	// 性能配置
	Performance PerformanceConfig `json:"performance"`

	// 日志配置
	Logging LoggingConfig `json:"logging"`
}

// 统一服务配置
type Service struct {
	Name       string `json:"name"`        // 服务名称
	ServerPort int    `json:"server_port"` // 服务器端口
	LocalPort  int    `json:"local_port"`  // 本地端口（外网模式）
	TargetHost string `json:"target_host"` // 目标主机（内网模式）
	TargetPort int    `json:"target_port"` // 目标端口（内网模式）
	Protocol   string `json:"protocol"`    // 协议类型
	Enabled    bool   `json:"enabled"`     // 是否启用
}

// 内网模式配置
type InternalModeConfig struct {
	Services []InternalService `json:"services"` // 服务映射列表
}

// 内网服务映射
type InternalService struct {
	Name        string `json:"name"`        // 服务名称
	ServerPort  int    `json:"server_port"` // 服务器端口
	TargetHost  string `json:"target_host"` // 目标主机地址
	TargetPort  int    `json:"target_port"` // 目标端口
	Protocol    string `json:"protocol"`    // 协议类型 (tcp/udp)
	Description string `json:"description"` // 服务描述
	Enabled     bool   `json:"enabled"`     // 是否启用
}

// 外部模式配置
type ExternalModeConfig struct {
	Services []ExternalService `json:"services"` // 外部服务列表
}

// 外部服务配置
type ExternalService struct {
	Name        string `json:"name"`        // 服务名称
	LocalPort   int    `json:"local_port"`  // 本地监听端口
	ServerAddr  string `json:"server_addr"` // 服务器地址
	ServerPort  int    `json:"server_port"` // 服务器端口
	Protocol    string `json:"protocol"`    // 协议类型 (tcp/udp)
	Description string `json:"description"` // 服务描述
	Enabled     bool   `json:"enabled"`     // 是否启用
}

// 安全配置
type SecurityConfig struct {
	// 全局认证配置
	DefaultAuthEnabled bool              `json:"default_auth_enabled"` // 默认是否启用认证
	DefaultAuthType    string            `json:"default_auth_type"`    // 默认认证类型: token/key/cert
	GlobalAuthConfig   map[string]string `json:"global_auth_config"`   // 全局认证配置参数

	// 加密配置
	TLSEnabled  bool   `json:"tls_enabled"`   // 是否启用TLS
	TLSCertFile string `json:"tls_cert_file"` // TLS证书文件
	TLSKeyFile  string `json:"tls_key_file"`  // TLS密钥文件

	// PSK加密配置
	PSKEnabled bool   `json:"psk_enabled"` // 是否启用PSK加密
	PSKKey     string `json:"psk_key"`     // PSK密钥
}

// 性能配置
type PerformanceConfig struct {
	MaxConnections       int      `json:"max_connections"`         // 最大连接数
	MaxServicesPerClient int      `json:"max_services_per_client"` // 每个客户端最大服务数
	BufferSize           int      `json:"buffer_size"`             // 缓冲区大小
	HeartbeatInterval    Duration `json:"heartbeat_interval"`      // 心跳间隔
	ConnTimeout          Duration `json:"conn_timeout"`            // 连接超时
	ConnectionTimeout    Duration `json:"connection_timeout"`      // 连接超时（别名）
	ReadTimeout          Duration `json:"read_timeout"`            // 读取超时
	WriteTimeout         Duration `json:"write_timeout"`           // 写入超时
	ReconnectInterval    Duration `json:"reconnect_interval"`      // 重连间隔
}

// 日志配置
type LoggingConfig struct {
	Level      string `json:"level"`       // 日志级别: debug/info/warn/error
	File       string `json:"file"`        // 日志文件路径
	MaxSize    int    `json:"max_size"`    // 日志文件最大大小(MB)
	MaxBackups int    `json:"max_backups"` // 最大备份文件数
	MaxAge     int    `json:"max_age"`     // 日志保留天数
	Compress   bool   `json:"compress"`    // 是否压缩
}

// 默认服务端配置
func DefaultServerConfig() *ServerConfig {
	return &ServerConfig{
		Host: "0.0.0.0",
		Services: []ServerService{
			{
				Name:        "ssh-proxy",
				Port:        2222,
				ServiceType: "proxy",
				Description: "SSH代理服务",
				Enabled:     true,
				Remote:      true, // 默认使用远程模式（通过客户端）
				TargetIP:    "",
				TargetPort:  0,
			},
			{
				Name:        "rdp-proxy",
				Port:        3389,
				ServiceType: "proxy",
				Description: "RDP代理服务",
				Enabled:     true,
				Remote:      true, // 默认使用远程模式（通过客户端）
				TargetIP:    "",
				TargetPort:  0,
			},
			{
				Name:        "management",
				Port:        9090,
				ServiceType: "management",
				Description: "管理服务端口",
				Enabled:     true,
				Remote:      true, // 管理端口总是远程模式
				TargetIP:    "",
				TargetPort:  0,
			},
		},
		Security: SecurityConfig{
			DefaultAuthEnabled: false,
			DefaultAuthType:    "token",
			TLSEnabled:         false,
			PSKEnabled:         false,
		},
		Performance: PerformanceConfig{
			MaxConnections:       1000,
			MaxServicesPerClient: 10,
			BufferSize:           32 * 1024, // 32KB
			HeartbeatInterval:    Duration(30 * time.Second),
			ConnTimeout:          Duration(10 * time.Second),
			ConnectionTimeout:    Duration(10 * time.Second),
			ReadTimeout:          Duration(30 * time.Second),
			WriteTimeout:         Duration(30 * time.Second),
			ReconnectInterval:    Duration(5 * time.Second),
		},
		Logging: LoggingConfig{
			Level:      "info",
			File:       "",
			MaxSize:    10,
			MaxBackups: 3,
			MaxAge:     7,
			Compress:   true,
		},
	}
}

// 默认客户端配置
func DefaultClientConfig() *ClientConfig {
	return &ClientConfig{
		Mode:       "internal",
		ServerAddr: "127.0.0.1",
		Internal: InternalModeConfig{
			Services: []InternalService{
				{
					Name:        "ssh-service",
					ServerPort:  2222,
					TargetHost:  "127.0.0.1",
					TargetPort:  22,
					Protocol:    "tcp",
					Description: "SSH服务映射",
					Enabled:     true,
				},
				{
					Name:        "rdp-service",
					ServerPort:  3389,
					TargetHost:  "127.0.0.1",
					TargetPort:  3389,
					Protocol:    "tcp",
					Description: "RDP服务映射",
					Enabled:     false,
				},
			},
		},
		External: ExternalModeConfig{
			Services: []ExternalService{
				{
					Name:        "ssh-client",
					LocalPort:   2222,
					ServerAddr:  "127.0.0.1",
					ServerPort:  2222,
					Protocol:    "tcp",
					Description: "SSH客户端代理",
					Enabled:     true,
				},
			},
		},
		Security: SecurityConfig{
			DefaultAuthEnabled: false,
			DefaultAuthType:    "token",
			TLSEnabled:         false,
			PSKEnabled:         false,
		},
		Performance: PerformanceConfig{
			MaxConnections:       100,
			MaxServicesPerClient: 5,
			BufferSize:           32 * 1024, // 32KB
			HeartbeatInterval:    Duration(30 * time.Second),
			ConnTimeout:          Duration(10 * time.Second),
			ReadTimeout:          Duration(30 * time.Second),
			WriteTimeout:         Duration(30 * time.Second),
			ReconnectInterval:    Duration(5 * time.Second),
		},
		Logging: LoggingConfig{
			Level:      "info",
			File:       "",
			MaxSize:    10,
			MaxBackups: 3,
			MaxAge:     7,
			Compress:   true,
		},
	}
}
